﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Threading;
using System.Globalization;
using System.Collections;
using System.Text;
using System.Collections.ObjectModel;
/************************************************************************************************************************************
 Copyright © 2010 - Banco Itaú BBA S.A

 DownloadBox :

 Histórico de Alterações:
 26/10/2012 - Murilo Figueiredo           - Geração do Relatório de Garantias PGR3 em Arquivo Excel na Camada de Negócio - OS277681

************************************************************************************************************************************/

namespace ibba.src.norisk.Controls
{
    public partial class ControlRelPGR3 : UserControl
    {
        #region Atributos

        private List<ServiceInstrumento.Instrumento> _instrumentos;
        private List<ServiceBem.Bem> _bens;
        private List<ServiceNatureza.Natureza> _naturezas;
        private List<ServiceGarantiaContrato.Garantidor> _garantidores;
        private List<ServiceGarantiaContrato.GrupoCliente> _grupoclientes;
        private List<ServiceGarantiaContrato.GarantiaPGR3> _garantiasPGR3;
        #region 26/10/2012 OS277681
        private string _caminhoArquivoRelatorio;
        #endregion

        private PageGarantiaContratoPresenter _pageGarantiaContratoPresenter;

        private PageInstrumentoPresenter _pageInstrumentoPresenter;
        private PageBemPresenter _pageBemPresenter;
        private PageNaturezaPresenter _pageNaturezaPresenter;
        System.Windows.Threading.DispatcherTimer myDispatcherTimer = new System.Windows.Threading.DispatcherTimer();

        long before;
        long after;
        TimeSpan elapsedTime;
        bool isActivated = false;
        int itemCount = 0;
        bool isError = false;
        public static Page ParentPage { get; set; }

        #endregion

        public ControlRelPGR3() 
        {
            InitializeComponent();

            //Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            App.MainPage.barraMenu.VisibilityButtons = System.Windows.Visibility.Collapsed;

            _pageGarantiaContratoPresenter = new PageGarantiaContratoPresenter();
            _pageInstrumentoPresenter = new PageInstrumentoPresenter();
            _pageBemPresenter = new PageBemPresenter();
            _pageNaturezaPresenter = new PageNaturezaPresenter();

            CarregarListaInstrumento();
            CarregarListaGarantidor();
            CarregarListaGrupoOperacaoGarantidor();
            CarregarComboFormalizada();
        }

        private void AlterarCursorParaAguardando()
        {
            this.Cursor = System.Windows.Input.Cursors.Wait;
        }

        private void AlterarCursorParaModoNormal()
        {
            this.Cursor = System.Windows.Input.Cursors.Arrow;
        }

        private bool ValidarData()
        {
            if (dtpData.SelectedDate.Equals(null))
            {
                MessageBoxHelper.ShowWarning("Aviso", "Selecione uma Data.");
                dtpData.Focus();
                return false;
            }
            else
                return true;
        }

        private void CarregarGridRelatorio()
        {
            try
            {
                if (ValidarData())
                {
                    StartTimer(null, null);
                    isActivated = true;
                    itemCount = 0;
                    AlterarCursorParaAguardando();
                    ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(true, "Aguarde...");

                    string _icFormalizada = "T";
                    int _cdInstrumento = -1;
                    int _cdBem = -1;
                    int _cdNatureza = -1;
                    int _cdGarantidor = -1;
                    int _cdGrupoOperacao = -1;
                    int _cdGrupoGarantidor = -1;
                    DateTime _dtBase;

                    ServiceGarantiaContrato.Garantidor ga = new ServiceGarantiaContrato.Garantidor();
                    ga = (ServiceGarantiaContrato.Garantidor)autoCompGarantidor.SelectedItemFix;

                    ServiceGarantiaContrato.GrupoCliente gc = new ServiceGarantiaContrato.GrupoCliente();
                    gc = (ServiceGarantiaContrato.GrupoCliente)autoCompGpOperacao.SelectedItemFix;

                    ServiceGarantiaContrato.GrupoCliente gg = new ServiceGarantiaContrato.GrupoCliente();
                    gg = (ServiceGarantiaContrato.GrupoCliente)autoCompGpGarantidor.SelectedItemFix;

                    _dtBase = Convert.ToDateTime(dtpData.SelectedDate.Value.ToString("yyyy-MM-dd"));

                    if (cboFormalizada.SelectedIndex != 0)
                    {
                        if (cboFormalizada.SelectedIndex == 1)
                            _icFormalizada = "1";
                        else _icFormalizada = "0";
                    }

                    if (cboInstrumento.SelectedItem != null)
                        _cdInstrumento = ((ServiceInstrumento.Instrumento)cboInstrumento.SelectedItem).CodInstrumento;

                    if (cboBem.SelectedItem != null)
                        _cdBem = ((ServiceBem.Bem)cboBem.SelectedItem).CodBem;

                    if (cboNatureza.SelectedItem != null)
                        _cdNatureza = ((ServiceNatureza.Natureza)cboNatureza.SelectedItem).CodNatureza;

                    if (ga != null)
                        _cdGarantidor = ga.CodGarantidor;

                    if (gc != null)
                        _cdGrupoGarantidor = gc.CodGrupoCliente;

                    if (gg != null)
                        _cdGrupoOperacao = gg.CodGrupoCliente;

                    #region 26/10/2012 OS277681
                    _pageGarantiaContratoPresenter.GerarRelatorioGarantiaPGR3(_icFormalizada, _cdGrupoGarantidor, _cdGrupoOperacao, _cdGarantidor, _cdNatureza, _cdBem, _cdInstrumento, _dtBase, CallBackGerarRelatorioGarantiaPGR3);
                    #endregion
                }
            }
            catch (Exception ex)
            {
                MessageBoxHelper.ShowErro("Erro", "Não foi possível executar a consulta. Por favor, recarregue a página e tente novamente", ex.Message.ToString());
                ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(false, null);
            }
        }

        private void GerarPlanilha()
        {
            if (_garantiasPGR3.Count != 0 && !isError)
            {
                ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(true, "Aguarde...");

                try
                {
                    ExportarWorkbook(_garantiasPGR3, false);
                }
                catch (Exception ex)
                {
                    MessageBoxHelper.ShowErro("Aviso", "Não foi possível exportar o arquivo! Verifique se o arquivo está aberto ou sendo usado por outro processo.", ex.Message.ToString());
                }
                finally
                {
                    ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(false, null);
                }
            }
            else
            {
                MessageBoxHelper.ShowWarning("Aviso", "Não há registros a serem exportados. Por favor, realize nova pesquisa.");
            }
        }

        public int ExportarWorkbook(List<ServiceGarantiaContrato.GarantiaPGR3> pGrid, bool pPermitirHeaderVazio)
        {
            int retorno = -1;
            int _row = 0;
            int _sheetCount = 1;

            IEnumerable source = (pGrid as IEnumerable);

            if (source == null)
                return retorno;

            SaveFileDialog oSFD = new SaveFileDialog()
            {
                Filter = "Excel Worksheets 2003 (*.xls)|*.xls",
                FilterIndex = 1
            };

            try
            {
                if (oSFD.ShowDialog() == true)
                {
                    string sFileType = "csv";

                    //Obtendo o tipo de arquivo
                    if (oSFD.SafeFileName.Contains('.'))
                        sFileType = oSFD.SafeFileName.Substring(oSFD.SafeFileName.LastIndexOf('.') + 1);

                    System.IO.Stream fileStream = oSFD.OpenFile();

                    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fileStream, Encoding.Unicode))
                    {
                        StringBuilder sb = new StringBuilder();

                        //Lendo os detalhes
                        foreach (ServiceGarantiaContrato.GarantiaPGR3 data in source)
                        {
                            if (_row > 65535)
                            {
                                _row = 0;
                            }

                            if (_row == 0)
                            {
                                _sheetCount++;

                                //Lendo o cabecalho
                                sb.Append(GeraCabecalho());

                                _row++;

                                sw.WriteLine(sb.ToString());
                                sb.Clear();
                            }

                            _row++;

                            sw.WriteLine(GeraLinha(data));
                            sb.Clear();
                        }
                    }

                    MessageBoxHelper.ShowSucess("Sucesso", "Arquivo " + oSFD.SafeFileName + " gerado com sucesso.");
                    retorno = 0;
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                if (string.IsNullOrEmpty(oSFD.SafeFileName))
                {
                    retorno = -1;
                }
                oSFD = null;
            }

            return retorno;
        }

        private string GeraLinha(ServiceGarantiaContrato.GarantiaPGR3 data)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(String.Concat("=", '"', data.CodContrato, '"')); sb.Append("\t");
            sb.Append(data.CodCliente); sb.Append("\t");
            sb.Append(data.NomCliente); sb.Append("\t");
            sb.Append(data.CodGrupoCliente); sb.Append("\t");
            sb.Append(data.DscGrupoCliente); sb.Append("\t");
            sb.Append(data.CodProduto); sb.Append("\t");
            sb.Append(data.CodModalidade); sb.Append("\t");
            sb.Append(data.DtAbertura); sb.Append("\t");
            sb.Append(data.DtVencimento); sb.Append("\t");
            sb.Append(data.VlOperacao.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.VlContabil.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.VlRiscoConcordata.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.NrGarantia); sb.Append("\t");
            sb.Append(data.CodInstrumento); sb.Append("\t");
            sb.Append(data.DscInstrumento); sb.Append("\t");
            sb.Append(data.CodBem); sb.Append("\t");
            sb.Append(data.DscBem); sb.Append("\t");
            sb.Append(data.CodNatureza); sb.Append("\t");
            sb.Append(data.DscNatureza); sb.Append("\t");
            sb.Append(data.PercHE.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.PercHV.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.PercLMM.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.CodAcao); sb.Append("\t");
            sb.Append(data.CodBolsa); sb.Append("\t");
            sb.Append(data.VlGarantia.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.CodMoeda); sb.Append("\t");
            sb.Append(data.VlGarantiaMoeda.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.PercIncidenciaGarantia.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.CodFormaPgto); sb.Append("\t");
            sb.Append(data.VlTaxaSwap.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.VlGerencial.ToString().Replace(",", ".")); sb.Append("\t");
            sb.Append(data.IcTransfere); sb.Append("\t");
            sb.Append(data.IcFormalizada); sb.Append("\t");
            sb.Append(data.CodGarantidor); sb.Append("\t");
            sb.Append(data.DscGarantidor); sb.Append("\t");
            sb.Append(String.Concat("=", '"', data.NrCnpjCpf, '"')); sb.Append("\t");
            sb.Append(data.CodTipoPessoa); sb.Append("\t");
            sb.Append(data.CodGrupoGarantidor); sb.Append("\t");
            sb.Append(data.DscGrupoGarantidor); sb.Append("\t");
            sb.Append(data.CodRiskRating); sb.Append("\t");
            sb.Append(data.VlTratamentoEAD.ToString().Replace(",", ".")); sb.Append("\t");

            return sb.ToString();
        }

        private string GeraCabecalho()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(@"Contrato"); sb.Append("\t");
            sb.Append(@"ID Cliente"); sb.Append("\t");
            sb.Append(@"Cliente"); sb.Append("\t");
            sb.Append(@"ID Grupo Cliente  "); sb.Append("\t");
            sb.Append(@"Descrição Grupo Cliente"); sb.Append("\t");
            sb.Append(@"Produto"); sb.Append("\t");
            sb.Append(@"Modalidade"); sb.Append("\t");
            sb.Append(@"Dt. Abertura"); sb.Append("\t");
            sb.Append(@"Dt.Vencimento"); sb.Append("\t");
            sb.Append(@"Vl.Abertura"); sb.Append("\t");
            sb.Append(@"Vl.Contabil"); sb.Append("\t");
            sb.Append(@"Vl.Risco Concordata"); sb.Append("\t");
            sb.Append(@"Nº Garantia"); sb.Append("\t");
            sb.Append(@"Cod. Instrumento"); sb.Append("\t");
            sb.Append(@"Descrição Instrumento"); sb.Append("\t");
            sb.Append(@"Cod. Bem"); sb.Append("\t");
            sb.Append(@"Descrição Bem"); sb.Append("\t");
            sb.Append(@"Cod. Natureza"); sb.Append("\t");
            sb.Append(@"Descrição Natureza"); sb.Append("\t");
            sb.Append(@"PC_HE (%)"); sb.Append("\t");
            sb.Append(@"PC_HV (%)"); sb.Append("\t");
            sb.Append(@"PC_LMM (%)"); sb.Append("\t");
            sb.Append(@"Cod. Ação"); sb.Append("\t");
            sb.Append(@"Cod. Bolsa"); sb.Append("\t");
            sb.Append(@"Vl. Garantia(R$)"); sb.Append("\t");
            sb.Append(@"Moeda Garantia"); sb.Append("\t");
            sb.Append(@"Vl. Garantia"); sb.Append("\t");
            sb.Append(@"Incidência(%)"); sb.Append("\t");
            sb.Append(@"Base Incidência"); sb.Append("\t");
            sb.Append(@"HairCut(%)"); sb.Append("\t");
            sb.Append(@"Vl.Gerencial(R$)"); sb.Append("\t");
            sb.Append(@"Instrumento Transfere"); sb.Append("\t");
            sb.Append(@"Formalização"); sb.Append("\t");
            sb.Append(@"ID Garantidor"); sb.Append("\t");
            sb.Append(@"Nome Garantidor"); sb.Append("\t");
            sb.Append(@"CGI/CPF/CNPJ Garantidor"); sb.Append("\t");
            sb.Append(@"Tipo Pessoa"); sb.Append("\t");
            sb.Append(@"ID Grupo Garantidor"); sb.Append("\t");
            sb.Append(@"Descrição Grupo Garantidor"); sb.Append("\t");
            sb.Append(@"Risk Rating Garantidor"); sb.Append("\t");
            sb.Append(@"Vl.Utilizado EAD(R$)"); sb.Append("\t");

            return sb.ToString();
        }

        private static string WriteHeader()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
            sb.AppendLine("<?mso-application progid=\"Excel.Sheet\"?>");
            sb.AppendLine("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\">");
            sb.AppendLine("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">");
            //sbResult.AppendLine("   <Author>" + AppHelper.LoginUsuario + "</Author>");
            sb.AppendLine("   <Created>" + DateTime.Now.ToLocalTime().ToLongDateString() + "</Created>");
            sb.AppendLine("   <LastSaved>" + DateTime.Now.ToLocalTime().ToLongDateString() + "</LastSaved>");
            //sbResult.AppendLine("   <Company>Sistema " + AppHelper.NomeSistema + "</Company>");
            sb.AppendLine("   <Version>12.00</Version>");
            sb.AppendLine("</DocumentProperties>");

            sb.AppendLine("<Styles>");
            sb.AppendLine("   <Style ss:ID=\"styleHeader\">");
            sb.AppendLine("       <Font ss:Color=\"#FFFFFF\" ss:Bold=\"1\"/>");
            sb.AppendLine("       <Interior ss:Color=\"#000000\" ss:Pattern=\"Solid\"/>");
            sb.AppendLine("   </Style>");
            sb.AppendLine("   <Style ss:ID=\"styleShortDate\">");
            sb.AppendLine("       <NumberFormat ss:Format=\"Short Date\"/>");
            sb.AppendLine("   </Style>");
            sb.AppendLine("   <Style ss:ID=\"styleMoeda\" ss:Name=\"Separador de milhares\">");
            sb.AppendLine("       <NumberFormat ss:Format=\"_(* #,##0.00_);_(* \\(#,##0.00\\);_(* &quot;-&quot;??_);_(@_)\"/>");
            sb.AppendLine("   </Style>");
            sb.AppendLine("</Styles>");
            sb.AppendLine("<Worksheet ss:Name=\"Silverlight Export\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">");
            sb.AppendLine("<Table>");

            return sb.ToString();
        }

        private static string WriteFooter()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("</Table>");
            sb.AppendLine("</Worksheet>");
            sb.AppendLine("</Workbook>");

            return sb.ToString();
        }

        private void ExibeCarregando(bool enable, string busyContent)
        {
            activity.BusyContent = busyContent;
            activity.IsBusy = enable;
            App.MainPage.barraMenu.VisibilityButtons = enable ? System.Windows.Visibility.Collapsed : System.Windows.Visibility.Visible;
        }

        public void StartTimer(object o, RoutedEventArgs args)
        {
            before = DateTime.Now.Ticks;
            myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 500);
            myDispatcherTimer.Tick += new EventHandler(Each_Tick);
            myDispatcherTimer.Start();
        }

        public void StopTimer(object o, RoutedEventArgs args)
        {
            isActivated = false;
            myDispatcherTimer.Stop();
        }

        #region Métodos Carregar Filtros

        private void CarregarListaInstrumento()
        {
            _pageInstrumentoPresenter.ObterInstrumento(CallBackObterInstrumento);
        }

        private void CallBackObterInstrumento(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _instrumentos = ((ServiceInstrumento.IInstrumento)pAsyncResult.AsyncState).EndObterInstrumento(pAsyncResult).OrderBy(instrumento => instrumento.DscInstrumento).ToList();

                ServiceInstrumento.Instrumento item = new ServiceInstrumento.Instrumento();
                item.CodInstrumento = -1;
                item.DscInstrumento = "Todos";

                _instrumentos.Insert(0, item);

                cboInstrumento.ItemsSource = _instrumentos;
                cboInstrumento.DisplayMemberPath = "DscInstrumento";
                cboInstrumento.SelectedItem = "CodInstrumento";

                cboInstrumento.SelectedIndex = 0;
            });
        }

        private void CarregarListaBem()
        {
            int _cdInstrumento;

            _cdInstrumento = ((ServiceInstrumento.Instrumento)cboInstrumento.SelectedItem).CodInstrumento;

            if (_cdInstrumento != 0)
            {
                _pageBemPresenter.ObterBem(_cdInstrumento, CallBackObterBem);
            }

            cboNatureza.ItemsSource = null;
        }

        private void CallBackObterBem(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _bens = ((ServiceBem.IBem)pAsyncResult.AsyncState).EndObterBem(pAsyncResult).OrderBy(bem => bem.DscBem).ToList();

                ServiceBem.Bem item = new ServiceBem.Bem();
                item.CodBem = -1;
                item.DscBem = "Todos";

                _bens.Insert(0, item);

                cboBem.ItemsSource = _bens;
                cboBem.DisplayMemberPath = "DscBem";
                cboBem.SelectedItem = "CodBem";

                cboBem.SelectedIndex = 0;
            });
        }

        private void CarregarListaNatureza()
        {
            int _cdBem = 0;
            int _cdInstrumento = 0;

            if (((ServiceBem.Bem)cboBem.SelectedItem) != null)
                _cdBem = ((ServiceBem.Bem)cboBem.SelectedItem).CodBem;

            if ((ServiceInstrumento.Instrumento)cboInstrumento.SelectedItem != null)
                _cdInstrumento = ((ServiceInstrumento.Instrumento)cboInstrumento.SelectedItem).CodInstrumento;

            if (_cdBem != 0)
            {
                cboNatureza.ItemsSource = null;

                _naturezas = new List<ibba.src.norisk.ServiceNatureza.Natureza>();

                _pageNaturezaPresenter.ObterNatureza(_cdBem, _cdInstrumento, CallBackObterNatureza);
            }
        }

        private void CallBackObterNatureza(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _naturezas = ((ServiceNatureza.INatureza)pAsyncResult.AsyncState).EndObterNatureza(pAsyncResult).OrderBy(natureza => natureza.DscNatureza).ToList();

                ServiceNatureza.Natureza item = new ServiceNatureza.Natureza();
                item.CodNatureza = -1;
                item.DscNatureza = "Todos";

                _naturezas.Insert(0, item);

                cboNatureza.ItemsSource = _naturezas;
                cboNatureza.DisplayMemberPath = "DscNatureza";
                cboNatureza.SelectedItem = "CodNatureza";

                cboNatureza.SelectedIndex = 0;
            });
        }

        private void CallBackObterGarantidor(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _garantidores = ((ServiceGarantiaContrato.IGarantiaContrato)pAsyncResult.AsyncState).EndObterGarantidor(pAsyncResult).ToList();

                ServiceGarantiaContrato.Garantidor item = new ServiceGarantiaContrato.Garantidor();
                item.CodGarantidor = -1;
                item.DscGarantidor = "Todos";
                _garantidores.Insert(0, item);

                autoCompGarantidor.ItemsSource = _garantidores;
            });
        }

        private void CarregarListaGarantidor()
        {
            _pageGarantiaContratoPresenter.ObterGarantidor(CallBackObterGarantidor);

        }

        private void CallBackObterGrupoCliente(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _grupoclientes = ((ServiceGarantiaContrato.IGarantiaContrato)pAsyncResult.AsyncState).EndObterGrupoCliente(pAsyncResult).ToList();

                ServiceGarantiaContrato.GrupoCliente item = new ServiceGarantiaContrato.GrupoCliente();
                item.CodGrupoCliente = -1;
                item.DscGrupoCliente = "Todos";
                _grupoclientes.Insert(0, item);

                autoCompGpGarantidor.ItemsSource = _grupoclientes;
                autoCompGpOperacao.ItemsSource = _grupoclientes;



            });
        }

        private void CarregarListaGrupoOperacaoGarantidor()
        {
            _pageGarantiaContratoPresenter.ObterGrupoCliente(CallBackObterGrupoCliente);

        }

        private void CarregarComboFormalizada()
        {

            ObservableCollection<string> itens = new ObservableCollection<string>();
            itens.Add("Todos");
            itens.Add("Sim");
            itens.Add("Não");

            cboFormalizada.DataContext = itens;
            cboFormalizada.SelectedIndex = 0;
        }

        private void CallBackObterGarantiasPGR3(IAsyncResult pAsyncResult)
        {
            List<ServiceGarantiaContrato.GarantiaPGR3> list = new List<ServiceGarantiaContrato.GarantiaPGR3>();

            this.Dispatcher.BeginInvoke((ThreadStart)delegate()
            {
                try
                {
                    list = ((ServiceGarantiaContrato.IGarantiaContrato)pAsyncResult.AsyncState).EndObterGarantiaPGR3(pAsyncResult).ToList();

                    _garantiasPGR3 = _garantiasPGR3.Union(list).ToList();

                    ++itemCount;

                    if (itemCount == (_instrumentos.Count - 1))
                    {
                        if (_garantiasPGR3.Count == 0)
                        {
                            MessageBoxHelper.ShowWarning("Aviso", "Dados não localizados. Por favor, realize uma nova pesquisa.");
                            App.MainPage.barraMenu.VisibilityButtons = System.Windows.Visibility.Collapsed;
                            App.MainPage.barraMenu.AtualizarControles();
                        }
                        else
                        {
                            MessageBoxHelper.ShowQuestion("Sucesso", "Dados gerados com sucesso. Confirme a exportação do relatório.", window_OnMessageBoxClosed);
                            App.MainPage.barraMenu.VisibilityButtons = System.Windows.Visibility.Visible;
                        }
                    }
                }
                catch (System.ServiceModel.CommunicationException ex)
                {
                    isError = true;
                    MessageBoxHelper.ShowErro("Erro", "Falha na comunicação. Por favor, recarregue a página e tente novamente", ex.Message.ToString());
                }
                catch
                {
                    isError = true;
                    throw;
                }
                finally
                {
                    if (itemCount == (_instrumentos.Count - 1) || isError)
                    {
                        AlterarCursorParaModoNormal();
                        ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(false, null);
                        StopTimer(null, null);

                        activity.IsBusy = false;
                        App.MainPage.barraMenu.VisibilityButtons = false ? System.Windows.Visibility.Collapsed : System.Windows.Visibility.Visible;
                    }
                }
            });
        }

        private void CallBackObterGarantiasPGR3PorInstrumento(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke((ThreadStart)delegate()
            {
                try
                {
                    List<ServiceGarantiaContrato.GarantiaPGR3> list = ((ServiceGarantiaContrato.IGarantiaContrato)pAsyncResult.AsyncState).EndObterGarantiaPGR3(pAsyncResult).ToList();

                    _garantiasPGR3 = _garantiasPGR3.Union(list).ToList();

                    if (_garantiasPGR3.Count == 0)
                    {
                        MessageBoxHelper.ShowWarning("Aviso", "Dados não localizados. Por favor, realize uma nova pesquisa.");
                        App.MainPage.barraMenu.VisibilityButtons = System.Windows.Visibility.Collapsed;
                        App.MainPage.barraMenu.AtualizarControles();
                    }
                    else
                    {
                        MessageBoxHelper.ShowQuestion("Sucesso", "Dados gerados com sucesso. Confirme a exportação do relatório", window_OnMessageBoxClosed);
                        App.MainPage.barraMenu.VisibilityButtons = System.Windows.Visibility.Visible;
                    }
                }
                catch (System.ServiceModel.CommunicationException ex)
                {
                    isError = true;
                    MessageBoxHelper.ShowErro("Erro", "Falha na comunicação. Por favor, recarregue a página e tente novamente", ex.Message.ToString());
                }
                catch
                {
                    isError = true;
                    throw;
                }
                finally
                {
                    AlterarCursorParaModoNormal();
                    ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(false, null);
                    StopTimer(null, null);

                    activity.IsBusy = false;
                    App.MainPage.barraMenu.VisibilityButtons = false ? System.Windows.Visibility.Collapsed : System.Windows.Visibility.Visible;
                }
            });
        }

        #region 26/10/2012 OS277681
        private void CallBackGerarRelatorioGarantiaPGR3(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke((ThreadStart)delegate()
            {
                try
                {
                    this._caminhoArquivoRelatorio = ((ServiceGarantiaContrato.IGarantiaContrato)pAsyncResult.AsyncState).EndGerarRelatorioGarantiaPGR3(pAsyncResult);

                    if (_caminhoArquivoRelatorio == string.Empty)
                    {
                        MessageBoxHelper.ShowWarning("Aviso", "Dados não localizados. Por favor, realize uma nova pesquisa.");
                        App.MainPage.barraMenu.VisibilityButtons = System.Windows.Visibility.Collapsed;
                        App.MainPage.barraMenu.AtualizarControles();
                    }
                    else
                    {
                        MessageBoxHelper.ShowDownload("Sucesso", "Dados gerados com sucesso. Confirme a exportação do relatório.", new Uri(this._caminhoArquivoRelatorio, UriKind.Absolute));
                        App.MainPage.barraMenu.VisibilityButtons = System.Windows.Visibility.Visible;
                        App.MainPage.barraMenu.AtualizarControles();
                    }
                }
                catch (System.ServiceModel.CommunicationException ex)
                {
                    isError = true;
                    MessageBoxHelper.ShowErro("Erro", "Falha na comunicação. Por favor, recarregue a página e tente novamente", ex.Message.ToString());
                }
                catch
                {
                    isError = true;
                    throw;
                }
                finally
                {
                    ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(false, null);

                    StopTimer(null, null);
                    AlterarCursorParaModoNormal();

                    activity.IsBusy = false;
                    App.MainPage.barraMenu.VisibilityButtons = false ? System.Windows.Visibility.Collapsed : System.Windows.Visibility.Visible;
                }
            });
        }
        #endregion
        #endregion

        #region Eventos

        private void cboInstrumento_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            CarregarListaBem();
        }

        private void cboBem_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            CarregarListaNatureza();
        }

        private void btnPesquisar_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            if (System.Windows.Browser.HtmlPage.BrowserInformation.ProductName.ToLower() != "firefox")
                CarregarGridRelatorio();
            else
                MessageBoxHelper.ShowExclamation("Aviso", "Não é possível extrair o relatório com o browser utilizado. Utilize o browser Internet Explorer para esta operação.");
        }

        void window_OnMessageBoxClosed(MessageBoxResult result)
        {
            if (result == MessageBoxResult.Yes)
            {
                ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(true, "Carregando...");
                this.GerarPlanilha();
            }
        }

        public void Each_Tick(object o, EventArgs sender)
        {
            if (isActivated)
            {
                after = DateTime.Now.Ticks;

                elapsedTime = new TimeSpan(after - before);

                if (elapsedTime.TotalSeconds >= 800)
                {
                    AlterarCursorParaModoNormal();
                    ((ibba.src.norisk.page.PageRelatorios)(ParentPage)).ExibeCarregando(false, null);
                    StopTimer(null, null);
                    isActivated = false;

                    throw new Exception("Não foi possível realizar a pesquisa, tente novamente");
                }
            }
        }
        #endregion
    }
}
